home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / dcview / src / execdos.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-08-28  |  6.5 KB  |  250 lines

  1. /******************************************************************************
  2.  *    ececdos.c:    DOSコマンド処理
  3.  ******************************************************************************
  4.  *
  5.  *
  6.  */
  7. #include <sxdef2.h>
  8. #include <stdio.h>
  9. #include <iocslib.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <io.h>
  13. #include <doslib.h>
  14. #include <event.h>        /* イベントマンを利用するときに必要    */
  15. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  16. #include <window.h>        /* ウィンドウマンを利用するときに必要    */
  17. #include <control.h>        /* コントロールマンを利用するときに必要    */
  18. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  19. #include <task.h>        /* タスクマンを利用するときに必要    */
  20. #include "DC.h"            /* このプログラム固有のヘッダファイル    */
  21.  
  22. /******************************************************************************
  23.  *    execDos():    DOSコマンド処理用のバッチファイル作成
  24.  ******************************************************************************
  25.  *    引数:    ComVal *pcv    共通変数へのポインタ
  26.  */
  27. void execDos(ComVal *pcv, char *comPt, char *path, int type)
  28. {
  29.     int len, i, j, drv, ii, ret, b_flag, b_no;
  30.     FILE *fn, *fn2;
  31.     char *str, *bufc;
  32.     char com[256], com_drv[90], temp_path[90], temp_drv[5], filePath[256];
  33.     char strbuf[90], buf[20][90];
  34.     char tempfname[90],PathSet[256], buff[90], buff2[256], batfname[90];
  35.     char bdrv[TS_NAMEMAX],bpath[TS_NAMEMAX],bnode[21],bext[5];
  36.  
  37.     temp_drv[0] = 0;        /* カレントドライブを調べる    */
  38.     if (!strncmp(pcv->currentPath, pcv->a_drv, strlen(pcv->a_drv))) {
  39.         strncpy(temp_drv, pcv->a_drv, 2);
  40.         strcpy(com_drv, pcv->a_drv);
  41.         drv = 1;
  42.     } else if (!strncmp(pcv->currentPath, pcv->b_drv, strlen(pcv->b_drv))) {
  43.         strncpy(temp_drv, pcv->b_drv, 2);
  44.         strcpy(com_drv, pcv->b_drv);
  45.         drv = 2;
  46.     } else {
  47.         strncpy(temp_drv, pcv->c_drv, 2);
  48.         strcpy(com_drv, pcv->c_drv);
  49.         drv = 3;
  50.     }
  51.  
  52.     temp_drv[2] = 0;
  53.  
  54.     len = strlen(comPt);        /* コマンドライン抽出        */
  55.     for(i=0;i<len;i++) {
  56.         if (*comPt == ':')
  57.             break;
  58.         comPt++;
  59.     }
  60.     comPt++;
  61.     str = comPt;
  62.     for(j=0;j<len-i;j++) {
  63.         if (*comPt == ';')
  64.             break;
  65.         comPt++;
  66.     }
  67.     *comPt = 0;
  68.     strcpy(com, str);
  69.     replace(pcv, com, drv);
  70.  
  71.     len = strlen(com);
  72.     bufc = com;
  73.     comPt = com;
  74.     j = 0;
  75.     ii = 0;
  76.     for(i=1;i<len+2;i++) {
  77.         if (*comPt == 0 || *comPt == '|') {
  78.             if (*comPt == '|') {
  79.                 comPt++;
  80.                 if (*comPt == ' ') {
  81.                     comPt++;
  82.                 }
  83.             }
  84.             buf[ii][0] = 0;
  85.             strncpy(&buf[ii][0], bufc, i - j);
  86.             buf[ii][i - j - 1] = 0;
  87.             bufc = comPt;
  88.             bufc++;
  89.             j = i;
  90.             ii++;
  91.         }
  92.         if (*comPt == 0)
  93.             break;
  94.         comPt++;
  95.     }
  96.  
  97.     sprintf(batfname, "%s\\AUTOEXEC.BAT", pcv->a_drv);
  98.     fn = fopen(batfname, "rt");    /* AUTOEXEC.BATからPATHの設定を読み込む    */
  99.     if (fn == NULL) {
  100.         sprintf(buff, "%s\rが見つかりませんでした!", batfname);
  101.         DMError(D_CONFIRM, buff);
  102.         return;
  103.     }
  104.     while(fgets(filePath, 256, fn) != NULL) {
  105.         stoupper(filePath);
  106.         if (!strncmp(filePath, "PATH",4))
  107.             break;
  108.     }
  109.     fclose(fn);
  110.     replace(pcv, filePath, 1);
  111.  
  112.     b_flag = 0;
  113.     b_no = 0;
  114.     for(i=0;i<ii;i++) {        /* パス指定検索        */
  115.         strsfn(&buf[i][0], bdrv, bpath, bnode, bext);
  116.         if (!strcmp(bext, "bat") || !strcmp(bext, "BAT")) {
  117.             ret = TSSearchFile3(0, 2, &buf[i][0], buff, filePath, NULL);
  118.             if (ret<0) {
  119.                 break;
  120.             } else {
  121.                 b_flag = 1;
  122.                 b_no = i;
  123.                 break;
  124.             }
  125.         }
  126.     }
  127.  
  128.     sprintf(tempfname, "%s%s", pcv->myPath, "DCV_COM.BAT");
  129.                     /* バッチファイル作成        */
  130.     fn = fopen(tempfname, "wt");
  131.     if (fn == NULL) {
  132.         DMError(D_CONFIRM,"バッチファイル作成に失敗しました(1)!");
  133.         return;
  134.     }
  135.  
  136.     
  137.     fprintf(fn, "ECHO OFF\n");
  138.     fprintf(fn, "SET OLDPATH = %sPATH%s\n", "%", "%");
  139.     fprintf(fn, "%s", filePath);
  140.     fprintf(fn, "%s\n", temp_drv);
  141.     structfname(pcv, path, "", temp_path);
  142.     fprintf(fn, "CD %s\n", temp_path);
  143.     if (b_flag) {
  144.         for(i=0;i<b_no;i++) {
  145.             fprintf(fn, &buf[i][0]);
  146.         }
  147.         fn2 = fopen(buff, "rt");
  148.         if (fn2 == NULL) {
  149.             DMError(D_CONFIRM,"バッチファイル作成に失敗しました(2)!");
  150.             fclose(fn);
  151.             return;
  152.         }
  153.         while(fgets(buff2, 256, fn2) != NULL) {
  154.             replace(pcv, buff2, drv);
  155.             fprintf(fn, "%s\n", buff2);
  156.         }
  157.         for(i=b_no+1;i<ii;i++) {
  158.             fprintf(fn, &buf[i][0]);
  159.         }        fclose(fn2);
  160.     } else {
  161.         fprintf(fn, "%s\n", com);
  162.     }
  163.     fprintf(fn, "PATH = %sOLDPATH%s\n", "%", "%");
  164.     fprintf(fn, "SET OLDPATH =\n");
  165.     fprintf(fn, "\n");
  166.     fclose(fn);
  167.  
  168. }
  169.  
  170. /******************************************************************************
  171.  *    replace():    パスを現状の環境に合わせて書き直す
  172.  ******************************************************************************
  173.  *    引数:    ComVal *pcv    共通変数へのポインタ
  174.  */
  175. void replace(ComVal *pcv, char *com, int drv)
  176. {
  177.     char *comPt, *c_drv[4];
  178.     char com2[256], d_drv[90];
  179.     int path_start = 1;
  180.  
  181.     c_drv[1] = pcv->a_drv;
  182.     c_drv[2] = pcv->b_drv;
  183.     c_drv[3] = pcv->c_drv;
  184.  
  185.     comPt = com;
  186.     while(*comPt) {
  187.         if (*comPt == ' ')
  188.             path_start = 0;
  189.         if ((*comPt == '-') || (*comPt == '/'))
  190.             path_start = 1;
  191.         if (*comPt == '\\') {
  192.             if (path_start) {
  193.                 if (com == comPt) {
  194.                     sprintf(com2, "%s%s", c_drv[drv], comPt++);
  195.                     comPt += strlen(c_drv[drv]) - 1;
  196.                 } else {
  197.                     *comPt++ = 0;
  198.                     sprintf(com2, "%s%s\\%s", com, c_drv[drv], comPt++);
  199.                     comPt += strlen(c_drv[drv]);
  200.                 }
  201.             strcpy(com, com2);
  202.             path_start = 0;
  203.             }
  204.         }
  205.         if (((*comPt == ' ') || (*comPt == '|')) && *(comPt+1) == '\\') {
  206.             if (*comPt == '|') {
  207.                 *comPt++ = 0;
  208.                 sprintf(com2, "%s|%s%s", com, c_drv[drv], comPt++);
  209.             } else {
  210.                 *comPt++ = 0;
  211.                 sprintf(com2, "%s %s%s", com, c_drv[drv], comPt++);
  212.             }
  213.             comPt += strlen(c_drv[drv]);
  214.             strcpy(com, com2);
  215.         }
  216.         if ((*comPt == 'A' || *comPt == 'B' || *comPt == 'a' || *comPt == 'b') && *(comPt+1) == ':') {
  217.             if (*comPt == 'A' || *comPt == 'a') {
  218.                 drv = 1;
  219.             } else {
  220.                 drv = 2;
  221.             }
  222.             *comPt = 0;
  223.             comPt += 2;
  224.             if (*comPt == '\\') {
  225.                 if (*(comPt-3) == ' ') {
  226.                     sprintf(com2, "%s %s%s", com, c_drv[drv], comPt++);
  227.                     comPt += strlen(c_drv[drv]) - 1;
  228.                 } else {
  229.                     sprintf(com2, "%s%s%s", com, c_drv[drv], comPt++);
  230.                     comPt += strlen(c_drv[drv]) - 2;
  231.                 }
  232.                 strcpy(com, com2);
  233.             } else {
  234.                 *d_drv = 0;
  235.                 strncpy(d_drv, c_drv[drv], 2);
  236.                 d_drv[2] = 0;
  237.                 if (*(comPt-3) == ' ') {
  238.                     sprintf(com2, "%s %s||CD %s%s", com, d_drv, c_drv[drv], comPt++);
  239.                     comPt += strlen(c_drv[drv]) + 2 + 5;
  240.                 } else {
  241.                     sprintf(com2, "%s%s||CD %s%s", com, d_drv, c_drv[drv], comPt++);
  242.                     comPt += strlen(c_drv[drv]) + 2 + 5 - 1;
  243.                 }
  244.                 strcpy(com, com2);
  245.             }
  246.             path_start = 0;
  247.         }
  248.         comPt++;
  249.     }
  250. }